;*** File Five *** > DOS05
 TTL  - DOS05 - Sequential filing system
;FILE 05.  SEQUENTIAL FILES.


; HMTSPE
; Closes spool/Exec file if necc.
; Expects DCRYPTed handle in DCBY
HMTSPE LDAIM &C6 ; Read EXEC handle
 JSR READBY ; Into X

 TXA
 BEQ HMTSP1 ; If not EXECing anyway

 JSR HMTCMP
 BNE HMTSP1

 LDAIM &C6 ; Set the EXEC handle to 0
 BNE HMTBYT

HMTSP1 LDAIM &C7 ; Read SPOOL handle
 JSR READBY ; Into X
 JSR HMTCMP
 BNE HMTSP2

 LDAIM &C7 ; Set the SPOOL handle to 0

HMTBYT LDXIM &00
 LDYIM &00
 JMP OSBYTE

HMTCMP TXA
 TAY ; Handle in Y
 JSR DCRYPT
 CPY DCBY ; See if the same
HMTSP2 RTS


;VBGET READS A CHARACTER FROM
;THE SEQUENTIAL FILE INDICATED
;BY Y. RETURNS WITH C SET AT
;END OF FILE. FAILS IF Y WAS
;BAD IN ANY WAY.


WFEOF PHA
 TYA
 PHA
 TXA
 TAY
 JSR DCRYCH
 TYA
 JSR PCMP
 BNE WFEOF0
 LDXIM &FF
 BNE WFEOF2
WFEOF0 LDXIM &00
WFEOF2 PLA
 TAY
 PLA
DCRYC0 RTS

;Decrypt and check valid handle
DCRYCH JSR DCRYPT
 JSR CHEEKY
 BCC DCRYC0

WFEOF1 JSR HMTSPE ; ********* Close SPOOL | EXEC file.... HMT
 JSR ESTRNG
 = CHNNUM,"Channel",&00

ILLEOF JSR ESTRNG
 = EOFNUM,"EOF",&00

WBGET JSR SAVIT
 JSR DCRYCH  ;Check handle
 TYA
 JSR PCMP  ; COMPARE P,L
 BNE NOTEOF
 LDAAY SEQFLG
 ANDIM &10
 BNE ILLEOF ; BRK ON 2ND EOF
 LDAIM &10
 JSR SETBIT
 LDX SEQWX
 LDAIM &FE  ;Return EOF
 SEC
 RTS ; RETURN WITH C=1
NOTEOF LDAAY SEQFLG
 BMI VBGETB ; BUFFER OK
 JSR SETQ  ;Set qualif/drive
 JSR BFLUSH
 SEC
 JSR XBLOCK ; READ NEXT BLOCK
VBGETB LDAAY SEQPL ; BUFFER OFFSET
 STA WORK
 LDAAY SEQBUF
 STA WORK + &01 ; ADDRESS IN BUFFER
 LDYIM &00
 LDAIY WORK ; NEXT CHARACTER
 PHA  ;Save read char
 LDY DCBY
 LDX WORK
 INX
 TXA
 STAAY SEQPL
 BNE VBGETX ; NO CARRY. EXIT
 CLC
 LDAAY SEQPM
 ADCIM &0001
 STAAY SEQPM
 LDAAY SEQPH
 ADCIM &00
 STAAY SEQPH
 JSR CLRCBF
VBGETX CLC
 PLA
 RTS

SETDA CLC
 LDAAY SEQLOC
 ADCAY SEQPM
 STA WORK + &09
 STAAY SEQDAL ; BLOCK ADDRESS (L)
 LDAAY SEQLH
 ANDIM &03
 ADCAY SEQPH
 STA WORK + &08
 STAAY SEQDAH ; BLOCK ADDRESS (H)

SETCBF LDAIM &80
SETBIT ORAAY SEQFLG
 BNE CLRBT3  ;Always
CLRCBF LDAIM &7F
CLRBIT ANDAY SEQFLG
CLRBT3 STAAY SEQFLG
 CLC
 RTS

BFLUSH LDAAY SEQFLG
 ANDIM &40 ;  CBU
 BEQ BFLX  ; NOTHING TO DO
;BFLUSH SHOULD ONLY BE CALLED
;WHEN THE DCB IS CHECKSUM-SAFE
 CLC

;XBLOCK READS OR WRITES
;ONE BLOCK (READ IF C=1)
;BETWEEN DISC AND THE BUFFER
;ASSOCIATED WITH A SEQUENTIAL
;FILE. THE DISC ADDRESS IS
;DERIVED FROM THE FILE'S
;SEQUENTIAL POINTER FOR READS
;AND FOR SEQDA FOR WRITES.
;Y IDENTIFIES THE DCB.
XBLOCK PHP ; CONTAINS R/W BIT
 INC SEQSEM ; := 0
 JSR DRVSEL
 LDY DCBY
 LDAAY SEQBUF
 STA WORK + &03
 JSR DETUBE  ;Buffers this side of tube
 LDAIM &00
 STA WORK + &02
 STA WORK + &06
 LDAIM &01
 STA WORK + &07 ; LENGTH = 1 SECTOR
;NOW A FAKE DIRECTORY ENTRY
;HAS BEEN CREATED. USE IT TO
;READ A BLOCK....
 PLP  ;  ... OR WRITE ONE
 BCS XBLRD
 LDAAY SEQDAL
 STA WORK + &09
 LDAAY SEQDAH
 STA WORK + &08
 JSR BLKWR  ; DISC DRIVER ENTRYPOINT
 LDY DCBY
 LDAIM &BF
 JSR CLRBIT
 BCC XBLFIN

XBLRD JSR SETDA ; GET DISC ADDRESS
 JSR BLKRD ; DISC DRIVER ENTRY
XBLFIN DEC SEQSEM ; := FF
 LDY DCBY  ;RESTORE Y BEFORE EXIT
BFLX RTS


VBPUT1 JMP DELPRT
VBPUT2 JSR ESTRNG
 = RDONUM,"Read only",&00

VBPUT JSR SAVITA
 JMP WBPUT1

WBPUT JSR SAVITA
 JSR DCRYCH
WBPUT1 PHA
 LDAAY SEQRDO
 BMI VBPUT2
 LDAAY SEQLOK
 BMI VBPUT1  ;File is locked
 JSR SETQ
 TYA
 CLC
 ADCIM &04
 JSR PCMP
 BNE NOTFUL
 JSR VLOOK3  ;Try to extend..
 LDX SEQWB
 SEC  ;Get length of space
 LDAAX DIRHIG + &07 ; Low order Disc address
 SBCAX CATHIG + &07 ; Low order Disc Size/Address of next file
 PHA
 LDAAX DIRHIG + &06 ; Hi order length
 SBCAX CATHIG + &06 ; Hi order Disc size/Address of next file
 ANDIM &03
 CMPAY SEQEH
 BNE VOK  ;Yes - so I can extend
 PLA
 CMPAY SEQEM
 BNE VOKSPL
 STY ATEMP
; LDAIM BYTESH ; (Dont) close SPOOL file HMT
; JSR READBY
; JSR DCRYPX
; CPY ATEMP
; BNE BPUT1
; JSR ZERSPH  ;Tell it it doesnt exist
; BPUT1 ; ************** LDY ATEMP ; ************** HMT
; ************** JSR VSHUT  ;No - close up and scream
; LDA ATEMP
 STY DCBY
 JSR HMTSPE ; ********* Close SPOOL & EXEC files.... HMT
 JSR ESTRNG
 = CNXNUM,"Can't extend",&00
VOK LDAAY SEQEH ; Old Hi order length
 CLC
 ADCIM &01 ; Round up to 64k only
 STAAY SEQEH
 ASLA
 ASLA
 ASLA
 ASLA
 EORAX CATHIG + &06
 ANDIM &30
 EORAX CATHIG + &06
 STAAX CATHIG + &06 ; Into Hi order length in catalogue
 PLA
 LDAIM &00 ; Lo order = 0
VOKSPL STAAX CATHIG + &05
 STAAY SEQEM
 LDAIM &00
 STAAX CATHIG + &04
 JSR DIROUT
 JSR DSKFIN
 LDY DCBY
NOTFUL LDAAY SEQFLG
 BMI VBPUTB ; BUFFER ALLOCATED
 JSR BFLUSH
 LDAAY SEQLLA
 BNE NOTEND ; LOW(L) NE 0
 TYA
 JSR PCMP
 BNE NOTEND
 ;  AT THE END I DO NOT HAVE
 ;  TO READ A SECTOR.
 JSR SETDA
 BNE VBPUTB
NOTEND SEC
 JSR XBLOCK ;  READ BLOCK
;   (EVEN THOUGH FILE BEING
;USED FOR OUTPUT)
VBPUTB LDAAY SEQPL
 STA WORK
 LDAAY SEQBUF
 STA WORK + &01
 PLA
 LDYIM &00
 STAIY WORK ; CHAR -> FILE
 LDY DCBY
 LDAIM &40
 JSR SETBIT ;  CBU
 INC WORK
 LDA WORK
 STAAY SEQPL
 BNE NCARRY
 ; HERE I HAVE CARRY FROM LOW(P)
 JSR CLRCBF ; SEQFLG&:=#7F
 LDAAY SEQPM
 ADCIM &0001
 STAAY SEQPM
 LDAAY SEQPH
 ADCIM &00
 STAAY SEQPH  ; P INCREMENTED
NCARRY TYA
 JSR PCMP
 BCC VBPUTX ; NOT EXTENDING
 LDAIM &20 ;  DUF
 JSR SETBIT
 LDXIM &02
VBPUT3 LDAAY SEQPL
 STAAY SEQLLA
 INY
 DEX
 BPL VBPUT3
VBPUTX RTS

VSTAR JSR SAVITA
 JSR DCRYCH
;NOTE THAT THE NEXT TWO
;COMPARISONS TREAT THINGS
;AS UNSIGNED INTEGERS.

;*********** JSR STEP + $04
;*********** HMT, This is superflous

 LDY DCBY
VSTARA JSR SCMP
 BCS VSTARB  ; 0<=ARG<=LENGTH
 LDAAY SEQLLA  ;Set pointer to length
 STAAY SEQPL
 LDAAY SEQLMA
 STAAY SEQPM
 LDAAY SEQLHA
 STAAY SEQPH
 JSR VSTARC
;************************* HMT
; Preserve VTEMP so that BGBP works
 LDA VTEMP
 PHA
 LDA VTEMP+&01
 PHA
 LDA VTEMP+&02
 PHA
;************************* HMT
 LDAIM &00
 JSR VBPUT  ;Pad the file with nulls
;************************* HMT
 PLA
 STA VTEMP+&02
 PLA
 STA VTEMP+&01
 PLA
 STA VTEMP
;************************ HMT
 JMP VSTARA
VSTARB LDAZX &00
 STAAY SEQPL
 LDAZX &01
 STAAY SEQPM
 LDAZX &02
 STAAY SEQPH  ; SET P
VSTARC LDAIM &6F
 JSR CLRBIT ; CLEAR EOF, BUFFER
 LDAAY SEQLOC
 ADCAY SEQPM
 STA SEQWC ; DISC ADDRESS LOW
 LDAAY SEQLH
 ANDIM &03
 ADCAY SEQPH
 CMPAY SEQDAH
 BNE VBPUTX ; DIFFERENT SECTOR
 LDA SEQWC
 CMPAY SEQDAL
 BNE VBPUTX
 JMP SETCBF

;PCMP SETS THE COND CODES
;ON THE BASIS OF P COMPARED
;WITH L (IF A=Y) OR E
;(IF A=Y+4).
PCMP TAX
 LDAAY SEQPH
 CMPAX SEQLHA
 BNE PCMPX
 LDAAY SEQPM
 CMPAX SEQLMA
 BNE PCMPX
 LDAAY SEQPL
 CMPAX SEQLLA
PCMPX RTS

;SCMP COMPARES THE 3 BYTE
;ARG IN PAGE 0 (POINTED AT
;BY X) WITH L, OR WITH E
;IF Y HAS BEEN DISPLACED BY
;4.
SCMP LDAAY SEQLLA
 CMPZX &00
 LDAAY SEQLMA
 SBCZX &0001
 LDAAY SEQLHA
 SBCZX &0002
 RTS

;END OF SEQ FILE PACKAGE


 LNK DOS06

